﻿using System;
using System.Collections.Generic;
using System.Text;

namespace BingZi.HY.Core.SearchEngine.Configuration
{
    #region 原来版本
    /// <summary>
    /// 索引属性
    /// </summary>
    //public class SearchAttribute: Attribute
    //{
    //    private Lucene.Net.Documents.Field.Store _FieldStore =  Lucene.Net.Documents.Field.Store.NO;
    //    /// <summary>
    //    /// Field.Store.YES：索引文件本来只存储索引数据, 此设计将原文内容直接也存储在索引文件中，如文档的标题。 
    //    /// Field.Store.NO：原文不存储在索引文件中，搜索结果命中后，再根据其他附加属性如文件的Path，数据库的主键等，重新连接打开原文，适合原文内容较大的情况。 
    //    /// Field.Store.COMPRESS 压缩存储；
    //    /// </summary>
    //    public Lucene.Net.Documents.Field.Store FieldStore
    //    {
    //        get { return _FieldStore; }
    //        set { _FieldStore = value; }
    //    }


    //    private Lucene.Net.Documents.Field.Index _FieldIndex = Lucene.Net.Documents.Field.Index.NO;
    //    /// <summary>
    //    /// Field.Index.TOKENIZED：分词索引 
    //    /// Field.Index.UN_TOKENIZED：进行索引，但不对其进行分词，如作者名，日期等，Rod Johnson本身为一单词，不再需要分词。 
    //    /// Field.Index.NO 和 Field.Index.NO_NORMS：不进行索引，存放不能被搜索的内容如文档的一些附加属性如文档类型, URL等。
    //    /// </summary>
    //    public Lucene.Net.Documents.Field.Index FieldIndex
    //    {
    //        get { return _FieldIndex; }
    //        set { _FieldIndex = value; }
    //    }


    //    private Lucene.Net.Documents.Field.TermVector _FieldTermVector = Lucene.Net.Documents.Field.TermVector.NO;
    //    /// <summary>
    //    /// TermVector表示文档的条目（由一个Document和Field定位）和它们在当前文档中所出现的次数 
    //    /// Field.TermVector.YES:为每个文档（Document）存储该字段的TermVector 
    //    /// Field.TermVector.NO:不存储TermVector 
    //    /// Field.TermVector.WITH_POSITIONS:存储位置 
    //    /// Field.TermVector.WITH_OFFSETS:存储偏移量 
    //    /// Field.TermVector.WITH_POSITIONS_OFFSETS:存储位置和偏移量
    //    /// </summary>
    //    public Lucene.Net.Documents.Field.TermVector FieldTermVector
    //    {
    //        get { return _FieldTermVector; }
    //        set { _FieldTermVector = value; }
    //    }

    //    private Boolean _Boost = false;
    //    /// <summary>
    //    /// 是否权重字段
    //    /// </summary>
    //    public Boolean Boost
    //    {
    //        get { return _Boost; }
    //        set { _Boost = value; }
    //    }

    //    /// <summary>
    //    /// 构造索引属性
    //    /// </summary>
    //    /// <param name="__FieldStore">存储属性：
    //    /// Field.Store.YES:索引文件本来只存储索引数据, 此设计将原文内容直接也存储在索引文件中，如文档的标题。 
    //    /// Field.Store.NO:原文不存储在索引文件中，搜索结果命中后，再根据其他附加属性如文件的Path，数据库的主键等，重新连接打开原文，适合原文内容较大的情况。 
    //    /// Field.Store.COMPRESS 压缩存储；
    //    /// </param>
    //    /// <param name="__FieldIndex">索引属性：
    //    /// Field.Index.TOKENIZED:分词索引 
    //    /// Field.Index.UN_TOKENIZED:进行索引，但不对其进行分词，如作者名，日期等，Rod Johnson本身为一单词，不再需要分词。 
    //    /// Field.Index.NO 和 Field.Index.NO_NORMS：不进行索引，存放不能被搜索的内容如文档的一些附加属性如文档类型, URL等。
    //    /// </param>
    //    /// <param name="__FieldTermVector">TermVector表示文档的条目（由一个Document和Field定位）和它们在当前文档中所出现的次数：
    //    /// Field.TermVector.YES:为每个文档（Document）存储该字段的TermVector 
    //    /// Field.TermVector.NO:不存储TermVector 
    //    /// Field.TermVector.WITH_POSITIONS:存储位置 
    //    /// Field.TermVector.WITH_OFFSETS:存储偏移量 
    //    /// Field.TermVector.WITH_POSITIONS_OFFSETS:存储位置和偏移量
    //    /// </param>
    //    public SearchAttribute(Lucene.Net.Documents.Field.Store __FieldStore, 
    //        Lucene.Net.Documents.Field.Index __FieldIndex, 
    //        Lucene.Net.Documents.Field.TermVector __FieldTermVector)
    //    {
    //        _FieldStore = __FieldStore;
    //        _FieldIndex = __FieldIndex;
    //        _FieldTermVector = __FieldTermVector;
    //        _Boost = false;
    //    }


    //    /// <summary>
    //    /// 构造索引属性
    //    /// </summary>
    //    /// <param name="__FieldStore">存储属性：
    //    /// Field.Store.YES:索引文件本来只存储索引数据, 此设计将原文内容直接也存储在索引文件中，如文档的标题。 
    //    /// Field.Store.NO:原文不存储在索引文件中，搜索结果命中后，再根据其他附加属性如文件的Path，数据库的主键等，重新连接打开原文，适合原文内容较大的情况。 
    //    /// Field.Store.COMPRESS 压缩存储；
    //    /// </param>
    //    /// <param name="__FieldIndex">索引属性：
    //    /// Field.Index.TOKENIZED:分词索引 
    //    /// Field.Index.UN_TOKENIZED:进行索引，但不对其进行分词，如作者名，日期等，Rod Johnson本身为一单词，不再需要分词。 
    //    /// Field.Index.NO 和 Field.Index.NO_NORMS：不进行索引，存放不能被搜索的内容如文档的一些附加属性如文档类型, URL等。
    //    /// </param>
    //    /// <param name="__FieldTermVector">TermVector表示文档的条目（由一个Document和Field定位）和它们在当前文档中所出现的次数：
    //    /// Field.TermVector.YES:为每个文档（Document）存储该字段的TermVector 
    //    /// Field.TermVector.NO:不存储TermVector 
    //    /// Field.TermVector.WITH_POSITIONS:存储位置 
    //    /// Field.TermVector.WITH_OFFSETS:存储偏移量 
    //    /// Field.TermVector.WITH_POSITIONS_OFFSETS:存储位置和偏移量
    //    /// </param>
    //    /// <param name="__Boost">是否权重字段</param>
    //    public SearchAttribute(Lucene.Net.Documents.Field.Store __FieldStore,
    //        Lucene.Net.Documents.Field.Index __FieldIndex,
    //        Lucene.Net.Documents.Field.TermVector __FieldTermVector,
    //        Boolean __Boost)
    //    {
    //        _FieldStore = __FieldStore;
    //        _FieldIndex = __FieldIndex;
    //        _FieldTermVector = __FieldTermVector;
    //        _Boost = __Boost;
    //    }

    //}
    #endregion

     [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, 
        AllowMultiple = false, Inherited = false)]
    /// <summary>
    /// 索引属性
    /// </summary>
    public class SearchAttribute : Attribute
    {
         private Field_Store _FieldStore = Field_Store.NO;
        /// <summary>
        /// Field.Store.YES：索引文件本来只存储索引数据, 此设计将原文内容直接也存储在索引文件中，如文档的标题。 
        /// Field.Store.NO：原文不存储在索引文件中，搜索结果命中后，再根据其他附加属性如文件的Path，数据库的主键等，重新连接打开原文，适合原文内容较大的情况。 
        /// Field.Store.COMPRESS 压缩存储；
        /// </summary>
         public Field_Store FieldStore
        {
            get { return _FieldStore; }
            set { _FieldStore = value; }
        }


         private Field_Index _FieldIndex = Field_Index.NO;
        /// <summary>
        /// Field.Index.TOKENIZED：分词索引 
        /// Field.Index.UN_TOKENIZED：进行索引，但不对其进行分词，如作者名，日期等，Rod Johnson本身为一单词，不再需要分词。 
        /// Field.Index.NO 和 Field.Index.NO_NORMS：不进行索引，存放不能被搜索的内容如文档的一些附加属性如文档类型, URL等。
        /// </summary>
         public Field_Index FieldIndex
        {
            get { return _FieldIndex; }
            set { _FieldIndex = value; }
        }


         private Field_TermVector _FieldTermVector = Field_TermVector.NO;
        /// <summary>
        /// TermVector表示文档的条目（由一个Document和Field定位）和它们在当前文档中所出现的次数 
        /// Field.TermVector.YES:为每个文档（Document）存储该字段的TermVector 
        /// Field.TermVector.NO:不存储TermVector 
        /// Field.TermVector.WITH_POSITIONS:存储位置 
        /// Field.TermVector.WITH_OFFSETS:存储偏移量 
        /// Field.TermVector.WITH_POSITIONS_OFFSETS:存储位置和偏移量
        /// </summary>
        public Field_TermVector FieldTermVector
        {
            get { return _FieldTermVector; }
            set { _FieldTermVector = value; }
        }

        private Boolean _Boost = false;
        /// <summary>
        /// 是否权重字段
        /// </summary>
        public Boolean Boost
        {
            get { return _Boost; }
            set { _Boost = value; }
        }

        /// <summary>
        /// 构造索引属性
        /// </summary>
        /// <param name="__FieldStore">存储属性：
        /// Field.Store.YES:索引文件本来只存储索引数据, 此设计将原文内容直接也存储在索引文件中，如文档的标题。 
        /// Field.Store.NO:原文不存储在索引文件中，搜索结果命中后，再根据其他附加属性如文件的Path，数据库的主键等，重新连接打开原文，适合原文内容较大的情况。 
        /// Field.Store.COMPRESS 压缩存储；
        /// </param>
        /// <param name="__FieldIndex">索引属性：
        /// Field.Index.TOKENIZED:分词索引 
        /// Field.Index.UN_TOKENIZED:进行索引，但不对其进行分词，如作者名，日期等，Rod Johnson本身为一单词，不再需要分词。 
        /// Field.Index.NO 和 Field.Index.NO_NORMS：不进行索引，存放不能被搜索的内容如文档的一些附加属性如文档类型, URL等。
        /// </param>
        /// <param name="__FieldTermVector">TermVector表示文档的条目（由一个Document和Field定位）和它们在当前文档中所出现的次数：
        /// Field.TermVector.YES:为每个文档（Document）存储该字段的TermVector 
        /// Field.TermVector.NO:不存储TermVector 
        /// Field.TermVector.WITH_POSITIONS:存储位置 
        /// Field.TermVector.WITH_OFFSETS:存储偏移量 
        /// Field.TermVector.WITH_POSITIONS_OFFSETS:存储位置和偏移量
        /// </param>
        public SearchAttribute(Field_Store __FieldStore,
            Field_Index __FieldIndex,
            Field_TermVector __FieldTermVector)
        {
            _FieldStore = __FieldStore;
            _FieldIndex = __FieldIndex;
            _FieldTermVector = __FieldTermVector;
            _Boost = false;
        }


        /// <summary>
        /// 构造索引属性
        /// </summary>
        /// <param name="__FieldStore">存储属性：
        /// Field.Store.YES:索引文件本来只存储索引数据, 此设计将原文内容直接也存储在索引文件中，如文档的标题。 
        /// Field.Store.NO:原文不存储在索引文件中，搜索结果命中后，再根据其他附加属性如文件的Path，数据库的主键等，重新连接打开原文，适合原文内容较大的情况。 
        /// Field.Store.COMPRESS 压缩存储；
        /// </param>
        /// <param name="__FieldIndex">索引属性：
        /// Field.Index.TOKENIZED:分词索引 
        /// Field.Index.UN_TOKENIZED:进行索引，但不对其进行分词，如作者名，日期等，Rod Johnson本身为一单词，不再需要分词。 
        /// Field.Index.NO 和 Field.Index.NO_NORMS：不进行索引，存放不能被搜索的内容如文档的一些附加属性如文档类型, URL等。
        /// </param>
        /// <param name="__FieldTermVector">TermVector表示文档的条目（由一个Document和Field定位）和它们在当前文档中所出现的次数：
        /// Field.TermVector.YES:为每个文档（Document）存储该字段的TermVector 
        /// Field.TermVector.NO:不存储TermVector 
        /// Field.TermVector.WITH_POSITIONS:存储位置 
        /// Field.TermVector.WITH_OFFSETS:存储偏移量 
        /// Field.TermVector.WITH_POSITIONS_OFFSETS:存储位置和偏移量
        /// </param>
        /// <param name="__Boost">是否权重字段</param>
        public SearchAttribute(Field_Store __FieldStore,
            Field_Index __FieldIndex,
            Field_TermVector __FieldTermVector,
            Boolean __Boost)
        {
            _FieldStore = __FieldStore;
            _FieldIndex = __FieldIndex;
            _FieldTermVector = __FieldTermVector;
            _Boost = __Boost;
        }

    }

     public enum Field_Store
     {
         COMPRESS=1,
         NO=2,
         YES= 4
     }
     public enum Field_Index
     {
         NO = 1,
         NO_NORMS = 2,
         TOKENIZED = 4,
         UN_TOKENIZED=8
     }
     public enum Field_TermVector
     {
         NO = 1,
         WITH_OFFSETS = 2,
         WITH_POSITIONS = 4,
         WITH_POSITIONS_OFFSETS = 8,
         YES=16
     }
}
